package com.cd.common.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.cd.common.constant.HttpStatus;
import com.cd.common.constant.LqqConstant;
import com.cd.common.domain.AjaxResult;
import com.cd.common.domain.LoginUser;
import com.cd.common.dto.ErrorDto;
import com.cd.common.exception.LqqException;
import com.cd.common.util.AuthUtils;
import com.cd.common.util.PageDomain;
import com.cd.common.util.PageUtils;
import com.cd.common.util.SqlUtil;
import com.cd.common.util.StringUtils;
import com.cd.common.util.TableDataInfo;
import com.cd.common.util.TableSupport;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@RestController
public class BaseController {
    @ExceptionHandler({RuntimeException.class})
    public ErrorDto internalServerError(HttpServletResponse response, RuntimeException re)
            throws IOException {
        // 如果异常不是ParseRuleException类型的，则记录日志
        // log.error("failed to process the request", re);
        response.setStatus(HttpStatus.ERROR);
        // 返回错误响应对象
        return buildError(re);
    }


    private ErrorDto buildError(Exception ex) {
        // 创建一个ErrorDto对象用于存储错误信息
        ErrorDto result = new ErrorDto();
        // 设置错误类型为异常的类名
        result.setErrorType(ex.getClass().getName());
        // 设置错误消息为异常的消息
        result.setErrorMessage(ex.getMessage());

        // 找到异常的根本原因
        Throwable root = findRootCause(ex);
        // 设置根本错误类型为异常的根本原因的类名
        result.setRootErrorType(root.getClass().getName());
        // 设置根本错误消息为异常的根本原因的消息
        result.setRootErrorMessage(root.getMessage());

        // 如果异常是LqqException类的实例
        if (ex instanceof LqqException) {
            // 设置错误码为927
            result.setErrorCode(927);
        } else {
            // 设置错误码为599，可以根据需要自定义错误码值
            result.setErrorCode(599);
            ex.printStackTrace();
        }
        if (ex instanceof NullPointerException
                ||ex instanceof IndexOutOfBoundsException){
            ex.printStackTrace();
        }

        // 返回ErrorDto对象
        return result;
    }


    /**
     * 查找异常的根原因
     *
     * @param tr 异常对象
     * @return 根原因对象
     */
    private Throwable findRootCause(Throwable tr) {
        Throwable root = tr;
        while (root.getCause() != null) {
            root = root.getCause();
        }

        return root;
    }

    /**
     * 获取用户缓存信息
     */
    public LoginUser getLoginUser() {
        return AuthUtils.getLoginUser();
    }

    /**
     * 获取登录用户id
     */
    public Long getUserId() {
        return getLoginUser().getUser().getUserId();
    }

    /**
     * 返回成功
     */
    public AjaxResult success() {
        return AjaxResult.success();
    }

    /**
     * 返回失败消息
     */
    public AjaxResult error() {
        return AjaxResult.error();
    }

    /**
     * 返回成功消息
     */
    public AjaxResult success(String message) {
        return AjaxResult.success(message);
    }

    /**
     * 返回成功消息
     */
    public AjaxResult success(Object data) {
        return AjaxResult.success(data);
    }

    /**
     * 返回失败消息
     */
    public AjaxResult error(String message) {
        return AjaxResult.error(message);
    }

    /**
     * 返回警告消息
     */
    public AjaxResult warn(String message) {
        return AjaxResult.warn(message);
    }
    /**
     * 响应返回结果
     *
     * @param rows 影响行数
     * @return 操作结果
     */
    protected AjaxResult toAjax(int rows)
    {
        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
    }

    /**
     * 响应返回结果
     *
     * @param result 结果
     * @return 操作结果
     */
    protected AjaxResult toAjax(boolean result)
    {
        return result ? success() : error();
    }

    /**
     * 设置请求分页数据 好处 方便 坏处 多查库 压力大
     */
    protected void startPage() {
        PageUtils.startPage();
    }

    /**
     * 设置请求排序数据
     */
    protected void startOrderBy() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.orderBy(orderBy);
        }
    }

    /**
     * 清理分页的线程变量
     */
    protected void clearPage() {
        PageUtils.clearPage();
    }

    /**
     * 响应请求分页数据
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    protected TableDataInfo getDataTable(List<?> list) {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
    }
    /**
     * 获取登录用户名
     */
    public String getUsername()
    {
        return getLoginUser().getUsername();
    }

    /**
     * @Description 获取用户的rediskey
     * @Author lqq
     * @Date 2024/6/19 14:19
     **/

    public String getRedisKey(String tokenId){
        String redisKey= LqqConstant.LOGINKEY_PREFIX+tokenId;
        return redisKey;
    }


}